package com.xjy.web.controller.system;

import com.xjy.common.annotation.Log;
import com.xjy.common.core.controller.BaseController;
import com.xjy.common.core.domain.AjaxResult;
import com.xjy.common.core.domain.entity.SysUser;
import com.xjy.common.core.domain.model.LoginUser;
import com.xjy.common.core.page.TableDataInfo;
import com.xjy.common.enums.BusinessType;
import com.xjy.common.exception.UtilException;
import com.xjy.common.utils.ServletUtils;
import com.xjy.common.utils.poi.ExcelUtil;
import com.xjy.framework.web.service.TokenService;
import com.xjy.system.domain.SysProj;
import com.xjy.system.domain.bo.SysPayaccountQueryBo;
import com.xjy.system.domain.bo.SysProjAddBo;
import com.xjy.system.domain.bo.SysProjEditBo;
import com.xjy.system.domain.bo.SysProjMigrateBaseInfosBo;
import com.xjy.system.domain.vo.SysPayaccountVo;
import com.xjy.system.domain.vo.SysProjVo;
import com.xjy.system.service.ISysPayaccountService;
import com.xjy.system.service.ISysProjService;
import io.jsonwebtoken.lang.Collections;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.List;


@Api(value = "项目基本信息控制器", tags = {"项目基本信息管理"})
@RestController
@RequestMapping("/system/proj")
public class SysProjController extends BaseController {
	@Autowired
	private ISysProjService iSysProjService;
	@Autowired
	private TokenService tokenService;
	@Autowired
	private ISysPayaccountService sysPayaccountService;



	/**
	 * 查询项目基本信息列表
	 */
	@ApiOperation("查询项目基本信息列表")
	@PreAuthorize("@ss.hasPermi('system:proj:list')")
	@GetMapping("/list")
	public TableDataInfo list(SysProj sysProj) {
		return iSysProjService.proj(sysProj);
	}

	/**
	 * 查询项目基本信息列表
	 */
	@ApiOperation("查询项目基本信息列表")
	@PreAuthorize("@ss.hasPermi('system:proj:list')")
	@GetMapping("/selectList")
	public List<SysProjVo> selectList(SysProj sysProj) {
		LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
		SysUser user = loginUser.getUser();
		sysProj.setAuditStatus(true);

		if (!user.isAdmin()) {
			sysProj.setUserId(user.getUserId());
		}
		return iSysProjService.listAll(sysProj);
	}

	/**
	 * 导出项目基本信息列表
	 */
	@ApiOperation("导出项目基本信息列表")
	@PreAuthorize("@ss.hasPermi('system:proj:export')")
	@Log(title = "项目基本信息", businessType = BusinessType.EXPORT)
	@GetMapping("/export")
	public AjaxResult<SysProjVo> export(@Validated SysProj sysProj) {
		List<SysProjVo> list = iSysProjService.listAll(sysProj);

		ExcelUtil<SysProjVo> util = new ExcelUtil<>(SysProjVo.class);
		return util.exportExcel(list, "项目基本信息");
	}

	/**
	 * 查询项目基本信息列表（不分页 用于下拉框使用）
	 */
	@ApiOperation("查询项目基本信息列表")
	@GetMapping("/listAll")
	public AjaxResult listAll(SysProj sysProj) {

		return AjaxResult.success(iSysProjService.listAll(sysProj));
	}

	/**
	 * 获取项目基本信息详细信息
	 */
	@ApiOperation("获取项目基本信息详细信息")
	@PreAuthorize("@ss.hasPermi('system:proj:query')")
	@GetMapping("/{id}")
	public AjaxResult<SysProjVo> getInfo(@NotNull(message = "主键不能为空")
										 @PathVariable("id") Long id) {
		return AjaxResult.success(iSysProjService.queryById(id));
	}


	/**
	 * 新增项目基本信息
	 */
	@ApiOperation("新增项目基本信息")
	@PreAuthorize("@ss.hasPermi('system:proj:add')")
	@Log(title = "项目基本信息", businessType = BusinessType.INSERT)
	@PostMapping
	public AjaxResult<Void> add(@Validated @RequestBody SysProjAddBo bo) {
		bo.setAuditStatus(false);
		return toAjax(iSysProjService.insertByAddBo(bo) ? 1 : 0);
	}

	/**
	 * 修改项目基本信息
	 */
	@ApiOperation("修改项目基本信息")
	@PreAuthorize("@ss.hasPermi('system:proj:edit')")
	@Log(title = "项目基本信息", businessType = BusinessType.UPDATE)
	@PutMapping("/edit")
	public AjaxResult<Void> edit(@Validated @RequestBody SysProjEditBo bo) {
		SysProjVo sysProjVo = iSysProjService.queryById(bo.getId());
		if (sysProjVo.getAuditStatus()) {
			throw new UtilException("该数据已经审核无法修改！");
		}
		return toAjax(iSysProjService.updateByEditBo(bo) ? 1 : 0);
	}

	/**
	 * 审批项目基本信息
	 */
	@ApiOperation("审批项目基本信息")
	@PreAuthorize("@ss.hasPermi('system:proj:edit')")
	@Log(title = "项目基本信息", businessType = BusinessType.UPDATE)
	@PutMapping("/audit")
	public AjaxResult<Void> audit(@Validated @RequestBody SysProjEditBo bo) {
		SysProjVo sysProjVo = iSysProjService.queryById(bo.getId());
		if (sysProjVo.getAuditStatus()) {
			throw new UtilException("该数据无需重新审批！");
		}
		bo.setAuditStatus(true);
		return toAjax(iSysProjService.updateByEditBo(bo) ? 1 : 0);
	}

	/**
	 * 删除项目基本信息
	 */
	@ApiOperation("删除项目基本信息")
	@PreAuthorize("@ss.hasPermi('system:proj:remove')")
	@Log(title = "项目基本信息", businessType = BusinessType.DELETE)
	@DeleteMapping("/{ids}")
	public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
								   @PathVariable Long[] ids) {
		return toAjax(iSysProjService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
	}

	@ApiOperation("通过userId查询项目")
	@GetMapping("/projsByUser")
	public List<SysProj> list() {
		LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
		SysUser user = loginUser.getUser();
		return iSysProjService.listByUser(user.getUserId());
	}

	/**
	 * 迁移项目的关联基本表数据
	 */
	@ApiOperation("迁移项目的关联基本表数据")
	//@PreAuthorize("@ss.hasPermi('system:proj:migrate')")
	@Log(title = "项目关联基本信息", businessType = BusinessType.INSERT)
	@PostMapping("/migrate")
	public AjaxResult<Void> migrate(@Validated @RequestBody SysProjMigrateBaseInfosBo bo) {

		if (bo.getOriginProjId().equals(bo.getDestProjId())) {
			error("被迁移的工程和目标工程不能相同");
		}

		SysPayaccountQueryBo queryBo = new SysPayaccountQueryBo();
		queryBo.setProjId(bo.getDestProjId());
		List<SysPayaccountVo> list = sysPayaccountService.queryList(queryBo);
		if (Collections.isEmpty(list)) {
			error("源项目的基础数据尚未存在，请先保证源项目有基础数据");
		}

		queryBo.setProjId(bo.getDestProjId());
		list = sysPayaccountService.queryList(queryBo);
		if (!Collections.isEmpty(list)) {
			error("目标项目的基础数据已经存在，若想迁移需要先清空已有数据");
		}

		return toAjax(iSysProjService.migrateBaseInfos(bo) ? 1 : 0);
	}
}
